package fms.thread;

import fms.controller.Grib2DataParseController;
import fms.controller.IFlyPlanParseController;
import fms.util.ConfUtil;
import fms.util.FileUtil;
import org.apache.log4j.Logger;

import java.io.File;

/**
 * Created by Administrator on 2014/9/12.
 * <p/>
 * 解析/保存Grib2信息的线程
 */
public class Grid2DataThread implements Runnable {
    private static Logger logger = Logger.getLogger(Grid2DataThread.class);


    private String dirPath;
    private String backupPath;
    private String backupGrib2SuccessDir;

    public Grid2DataThread(String dirPath, String backupPath, String backupGrib2SuccessDir) {
        this.dirPath = dirPath;
        this.backupPath = backupPath;
        this.backupGrib2SuccessDir = backupGrib2SuccessDir;
    }

    @Override
    public void run() {
        dealGrib2Data(dirPath, backupPath, backupGrib2SuccessDir);
    }

    /**
     * <p>
     * 解析处理grid2数据，从原scanDirPath中扫描文件解析，
     * 成功解析的入数据库中，解析不成功的进入备份文件目录。
     * </p>
     *
     * @param scanDirPath
     * @param backupDirPath
     */
    private static void dealGrib2Data(String scanDirPath, String backupDirPath, String backupGrib2SuccessDir) {
        // 判断指定目录中是否存在文件
        File fSacnDir = new File(scanDirPath);
        if ((null == fSacnDir) || !fSacnDir.isDirectory()) {
            logger.error("无法打开指定数据源目录！");
            return;
        }
        IFlyPlanParseController planParseControl = null;
        String[] fileNameList = fSacnDir.list();
        logger.debug(fileNameList.getClass() + "fileNameList");
        if (0 != fileNameList.length) {
            logger.info(fSacnDir + "含有的文件目录总数：" + fileNameList.length);
        }
        for (int i = 0; i < fileNameList.length; i++) {
            File childFile = new File(scanDirPath + File.separator + fileNameList[i]);
             logger.debug(childFile + "childFile");
            String fileTypeStr = ConfUtil.props.getProperty("Grid2Suffix");
            String fileTypes[] = fileTypeStr.split(",");
            if (childFile.isFile() && FileUtil.IsTargetDocByFileName(childFile, fileTypes) && FileUtil.IsGrib2DocByFileName(childFile)) {
                logger.info("检测到GRIB2数据，开始解析、入库" + fileNameList[i] + "！");
                planParseControl = new Grib2DataParseController();
            } else {
                   logger.error("数据源目录中存在与Grib2无关文件：" + childFile.getName());
                continue;
            }
            // grib2数据较大，边解析边多线程入库，航班飞行计划是先解析数据再入库
            boolean parseStatus = planParseControl.parseDataSource(childFile);
            if (parseStatus) {
                logger.info("Grib2数据" + childFile.getName() + "解析、入库完毕！");
                //System.gc();
                //配置是否备份解析成功的文件
                String isBackupSuccess = ConfUtil.props.getProperty("isBackupSuccess");
                if ("true".equalsIgnoreCase(isBackupSuccess)) {
                    if (!FileUtil.MoveFile(childFile, backupGrib2SuccessDir)) {
                        // 如果文件移动失败（eg：文件名重复，则直接删除）
                        if (!childFile.delete()) {
                            logger.error(childFile.getAbsolutePath() + "解析成功的Grib2文件删除失败，本服务停止！");
                            return;
                        } else {
                            logger.error("本次Grib2数据文件解析成功，文件" + fileNameList[i] + "无法移动，已删除！");
                        }
                    } else {
                        logger.error("本次Grib2数据文件解析成功，文件" + fileNameList[i] + "已被剪切至:" + backupGrib2SuccessDir + "！");
                    }
                } else {
                    if (!childFile.delete()) {
                        logger.error(childFile.getAbsolutePath() + "文件删除失败，本服务停止！");
                        return;
                    }
                }
                logger.info("Grib2数据" + childFile.getName() + "入库结束，文件已删除！");
            } else {
                // 如果文件移动失败（eg：文件名重复，则直接删除）
                if (!FileUtil.MoveFile(childFile, backupDirPath)) {
                    if (!childFile.delete()) {
                        logger.error(childFile.getAbsolutePath() + "无法解析的Grib2文件删除失败，本服务停止！");
                        return;
                    } else {
                        logger.error("本次Grib2数据文件无法解析，文件" + fileNameList[i] + "无法移动，已删除！");
                    }
                } else {
                    logger.error("本次Grib2数据文件无法解析，文件" + fileNameList[i] + "已被剪切至:" + backupDirPath + "！");
                }
            }
        } // for (int i = 0; i < fileNameList.length; i++) {
    }


}
